home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / ctrlt.c < prev    next >
C/C++ Source or Header  |  1993-01-11  |  26KB  |  1,251 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5.  
  6. extern UWORD CRX,CRY;
  7.  
  8. /* 右向き未確定化開始 */
  9. void
  10. ctrl_t_ctrl_f()
  11. {
  12.     UINT c;
  13.  
  14.     if (TBUFFC) {
  15.         return;
  16.     }
  17.  
  18.     c = line_cpx_code();
  19.     if (!c) {
  20.         ctrl_f0();
  21.         c = line_cpx_code();
  22.         if (!c) {
  23.             return;
  24.         }
  25.     } else if (c == CR) {
  26.         return;
  27.     }
  28.     TTOPL00 = line_my_top();    /* キャンセル用に保存 */
  29.     TL00 = TL0 = CL;    /* 変換バッファの開始行 */
  30.     CRX = CRY = 0;
  31.     TPX00 = TPX0 = CPX;
  32.     TX00 = TX0 = CX;
  33.     TY00 = TY0 = CY;
  34.     TBP00 = TBP0 = ANALYZE[CPX].BPOS;
  35.  
  36.     xf_init_tb();    /* 変換バッファカウンタ初期化 */
  37.  
  38.     ctrl_f0();
  39.  
  40.     TL1 = CL;    /* 変換バッファの終了行 */
  41.     TPX1 = CPX;
  42.     TX1 = CX;
  43.     TY1 = CY;
  44.     TBP1 = ANALYZE[CPX].BPOS;
  45.  
  46.     xf_append_tb(c);
  47.     disp_show_cursor();    /* カーソルのブリンクを強制的にオンにする */
  48. }
  49.  
  50. /* タブを見せる<->見せない */
  51. /* トグル */
  52. void
  53. ctrl_t_ctrl_i()
  54. {
  55.     TAB_VIEW = !TAB_VIEW;
  56.     ctrl_l();
  57. }
  58.  
  59. /* 改行を∇<->全角スペース */
  60. /* トグル */
  61. void
  62. ctrl_t_ctrl_m()
  63. {
  64.     CR_VIEW = !CR_VIEW;
  65.     disp_cr_mode();
  66.     ctrl_l();
  67. }
  68.  
  69. /* 行頭なら何もしない */
  70. /* 改行の上なら、カーソルの前とさらにその前 */
  71. /* それ以外なら、カーソルの下とその前を交換する */
  72. /* 後で訂正のこと!!!... */
  73. void
  74. ctrl_t_ctrl_t()
  75. {
  76.     UBYTE c;
  77.     int p0;
  78.  
  79.     if (CPX) {
  80.         if ((((c = line_cpx_1byte()) == EOS) || (c == CR))) {
  81.             p0 = CPX - 2;
  82.         } else {
  83.             p0 = CPX - 1;
  84.         }
  85.         if (p0 >= 0) {    /* CPXが1で、改行の上ということがありうる */
  86.             UBYTE w[VERY_LONG_LINE];
  87.             int i1,i2,i3;
  88.  
  89.             i1 = ANALYZE[p0].BPOS;
  90.             i2 = ANALYZE[p0 + 1].BPOS;
  91.             i3 = ANALYZE[p0 + 2].BPOS;
  92.             line_cl_strncpy(w,i1);
  93.             w[i1] = EOS;
  94.             line_cl_strncat(w,i2,i3 - i2);
  95.             w[i1 + (i3 - i2)] = EOS;
  96.             line_cl_strncat(w,i1,i2 - i1);
  97.             w[i3] = EOS;
  98.             line_cl_strcat(w,i3);
  99.             line_store_and_echo(CL,w);    /* 禁則処理で出し入れの可能性有り */
  100.             line_cl_cl();
  101.             change_check();
  102.             work_line_analyze();
  103.             work_cursor_cpx();
  104.             CX0 = CX;
  105.         }
  106.     } else {
  107.         /* 何もしない */
  108.     }
  109. }
  110.  
  111. /* BAKモードをトグルする */
  112. void
  113. ctrl_t_b()
  114. {
  115.     CURRENT_BAK = !(CURRENT_BAK);
  116.     disp_btm_bak_10_x(WDATA[CWN].WTEXTS);
  117. }
  118.  
  119. /* フルワイドでなければフルワイドにする */
  120. /* フルワイドならフルナローにする */
  121. /* トグル */
  122. void
  123. ctrl_t_w()
  124. {
  125.     if (ctrl_t_lyw_work_check()) return;
  126.     if ((LYW_UPPER) && (LYW_UNDER)) {    /* フルワイドである */
  127.         ctrl_t_lyw_work(0,LYW_MAIN0,0);    /* フルナローにする */
  128.     } else {                /* フルワイドではない */
  129.                         /* フルワイドにする */
  130.         ctrl_t_lyw_work(LYW_UPPER0,LYW_MAIN0,LYW_UNDER0);
  131.     }
  132. }
  133.  
  134. void
  135. ctrl_t_w0()
  136. {
  137.     if (ctrl_t_lyw_work_check()) return;
  138.     ctrl_t_lyw_work(0,LYW_MAIN0,0);
  139. }
  140.  
  141. void
  142. ctrl_t_w1()
  143. {
  144.     if (ctrl_t_lyw_work_check()) return;
  145.     ctrl_t_lyw_work(LYW_UPPER0,LYW_MAIN0,0);
  146. }
  147.  
  148. void
  149. ctrl_t_w2()
  150. {
  151.     if (ctrl_t_lyw_work_check()) return;
  152.     ctrl_t_lyw_work(0,LYW_MAIN0,LYW_UNDER0);
  153. }
  154.  
  155. void
  156. ctrl_t_w3()
  157. {
  158.     if (ctrl_t_lyw_work_check()) return;
  159.     ctrl_t_lyw_work(LYW_UPPER0,LYW_MAIN0,LYW_UNDER0);
  160. }
  161.  
  162. /* アッパーラインをトグルする */
  163. void
  164. ctrl_t_u()
  165. {
  166.     if (ctrl_t_lyw_work_check()) return;
  167.     ctrl_t_lyw_work((LYW_UPPER) ? 0:LYW_UPPER0,-1,-1);
  168. }
  169.  
  170. void
  171. ctrl_t_u0()
  172. {
  173.     if (ctrl_t_lyw_work_check()) return;
  174.     ctrl_t_lyw_work(0,-1,-1);
  175. }
  176.  
  177. void
  178. ctrl_t_u1()
  179. {
  180.     if (ctrl_t_lyw_work_check()) return;
  181.     ctrl_t_lyw_work(LYW_UPPER0,-1,-1);
  182. }
  183.  
  184. /* ロウアーラインをトグルする */
  185. void
  186. ctrl_t_l()
  187. {
  188.     if (ctrl_t_lyw_work_check()) return;
  189.     ctrl_t_lyw_work(-1,-1,(LYW_UNDER) ? 0:LYW_UNDER0);
  190. }
  191.  
  192. void
  193. ctrl_t_l0()
  194. {
  195.     if (ctrl_t_lyw_work_check()) return;
  196.     ctrl_t_lyw_work(-1,-1,0);
  197. }
  198.  
  199. void
  200. ctrl_t_l1()
  201. {
  202.     if (ctrl_t_lyw_work_check()) return;
  203.     ctrl_t_lyw_work(-1,-1,LYW_UNDER0);
  204. }
  205.  
  206. /* この関数が呼ばれる時は、ウインドウは CWN だけ */
  207. /* 初期のハードウェアフォーマットに相当する */
  208. /* -1 なら変えない */
  209. /* 新しい CY を返す */
  210. int
  211. ctrl_t_lyw_work0(int up,int main,int low)
  212. {
  213.     register int i,yd;
  214.     int dotall1;
  215.     int doty,ny;
  216.  
  217.     doty = CY*LYW_TOTAL;
  218.  
  219.     if (up >= 0) LYW_UPPER = up;
  220.     if (main >= 0) LYW_MAIN = main;
  221.     if (low >=0) LYW_UNDER = low;
  222.  
  223.     LYW_TOTAL = LYW_UPPER + LYW_MAIN + LYW_UNDER;
  224.  
  225.     XWIDTH = XWIDTH0;
  226.     dotall1 = (YWIDTH0)*LYW_MAIN0 - (LYW_MAIN0*3);    /* 実際の表示ドット数 */
  227. /* YWIDTH = 31 */
  228.     YWIDTH = (dotall1/LYW_TOTAL) + 2;
  229.     UNDER_Y = YWIDTH - 1;
  230. /* ウインドウは1つだけ */
  231.     for(yd=0,i=0;i< YWIDTH-2;i++,yd += LYW_TOTAL) {
  232.         YDOT[i] = yd ; LYW_UPPER;
  233.     }
  234.     YDOT[i++] = yd;yd += LYW_MAIN;        /* TWIDTH-2 */
  235.     YDOT[i++] = yd;yd += LYW_MAIN;        /* TWIDTH-1 */
  236.     YDOT[i] = (YWIDTH0-1)*LYW_MAIN0;    /* TWIDTH-0:特別 */
  237.     ny = doty/LYW_TOTAL;
  238.     return(ny);
  239. }
  240.  
  241. int
  242. ctrl_t_lyw_work_check()
  243. {
  244.     if (CWY0 || (CWY1 != UNDER_Y-2)) {    /* ウインドウが複数個ひらいている */
  245.         under_print((STR)"[ウインドウをひとつにしてから実行して下さい]");
  246.         return(1);
  247.     } else {
  248.         return(0);
  249.     }
  250. }
  251.  
  252. /* この関数が呼ばれる時は、ウインドウは CWN だけ */
  253. /* -1 なら変えない */
  254. void
  255. ctrl_t_lyw_work(int up,int main,int low)
  256. {
  257.     register int i;
  258.     int newy;
  259.  
  260.     newy = ctrl_t_lyw_work0(up,main,low);
  261.  
  262.     /* 表示変更 */
  263.     line_seigyou();
  264.     window_change_size(CWN,0,0,XWIDTH-1,YWIDTH-3);    /* カレントをフルサイズに */
  265.     init_clear_screen();
  266.  
  267.     for(i=0;i<YWIDTH0;i++) {
  268.         SCREEN[i] = NIL;
  269.     }
  270.  
  271.     for(i=0;i<MAX_WINDOW;i++) {
  272.         if (WDATA[i].WTEXTS >= 0) {
  273.             disp_btm_line(i);
  274.             SCREEN[WDATA[i].WY1+1] = NOT;        /* -1 */
  275.         }
  276.     }
  277.  
  278.     if (newy > CWY1) newy = CWY1;
  279.     disp_cl_y(newy);
  280.     work_cursor_cpx();
  281. }
  282. #if 0
  283. void
  284. ctrl_t_ctrl_d()
  285. {
  286.     int i;
  287.  
  288.     window0();
  289.     printf("%s\n",TBUFF);
  290.     for(i=0;i<(min(TBUFFC,30));i++) {
  291.         printf("%x:",TBUFF[i]);
  292.     }
  293. }
  294. #endif
  295. /* マークとの間を未変換にする */
  296. void
  297. ctrl_t_t()
  298. {
  299.     UNIT *wp;
  300.     int bp;
  301.     int y;
  302.     int a;
  303.  
  304.     if ((a = etc_get_arg()) >= MAX_MARK) {
  305.         under_print((STR)"マーク番号が不適当です");
  306.         return;
  307.     }
  308.  
  309.     line_seigyou();
  310.     if (wp = mark_get_mark(a,&bp)) {
  311.         if ((wp != CL) || (bp != ANALYZE[CPX].BPOS)) {
  312.             ctrl_t_t0(wp,bp,CL,ANALYZE[CPX].BPOS);
  313.             disp_show_cursor();
  314.         } else {
  315.             under_blanc();
  316.         }
  317.     } else {
  318.         UBYTE w[MAXLINE];
  319.         sprintf((char *) w,"マーク %1d は設定されていません",a);
  320.         under_print(w);
  321.     }
  322. }
  323.  
  324. void
  325. ctrl_t_t0(UNIT *p1,int b1,UNIT *p2,int b2)
  326. {
  327.     UBYTE w[VERY_LONG_LINE],w0[VERY_LONG_LINE];
  328.     register UNIT *wp;
  329.     register int be;
  330.     UINT mask;
  331.     UNIT *p00,*p000;
  332.     int b00,b000;
  333.  
  334.     p000 = CL;
  335.     b000 = ANALYZE[CPX].BPOS;
  336.     if (etc_line_order(&p1,&b1,&p2,&b2)) {    /* 勝手に入れ替えてくれる */
  337.     /* その行がカレントウインドウの中にあるかどうかを調べる */
  338.     /* あったなら相対的なY座標、なければ-1を返す */
  339.         register int lc1=0,lc2=0;
  340.         register UNIT *p;
  341.  
  342.         p00 = p1;b00 = b1;
  343.         if (p1 != p2) {
  344.             p = HEAD->ATO;
  345.             while(p != p2) {
  346.                 if (p == p1) {
  347.                     lc1 = lc2;
  348.                 }
  349.                 lc2++;
  350.                 p = p->ATO;
  351.             }
  352.         }
  353.         if ((lc2-lc1) > (CWY1-CWY0)) {
  354.             goto finis;
  355.         }
  356.         if (window_is_this_line_in_current(p1) < 0) {        /* 前が入ってない */
  357.             disp_top_flush(p1);
  358.         } else if (window_is_this_line_in_current(p2) < 0) {    /* 後が入ってない */
  359.             int movel;
  360.  
  361.             disp_top_flush(line_trace(p2,-CWY1,&movel));
  362.         }
  363.         jump(p1,b1);    /* 前に飛ぶ */
  364.         TTOPL00 = line_my_top();    /* キャンセル用に保存 */
  365.         TL00 = TL0 = CL;    /* 変換バッファの開始行 */
  366.         CRX = CRY = 0;
  367.         TPX00 = TPX0 = CPX;
  368.         TX00 = TX0 = CX;
  369.         TY00 = TY0 = CY;
  370.         TBP00 = TBP0 = ANALYZE[CPX].BPOS;
  371.  
  372.         xf_init_tb();    /* 変換バッファカウンタ初期化 */
  373.  
  374.         w[0] = EOS;
  375.         while(1) {
  376.             if (p1 == p2) {    /* 同じ行であった */
  377.                 line_get_body(w0,p1);
  378.                 w0[b2] = EOS;
  379.                 if (etc_limit_strcat(w,&w0[b1],VERY_LONG_LINE)) {
  380.                     goto finis;
  381.                 }
  382.                 if (b1 != b2) {
  383.                     change_check();
  384.                 }
  385.                 break;
  386.             } else {
  387.                 line_get_body(w0,p1);
  388.                 if (etc_limit_strcat(w,&w0[b1],VERY_LONG_LINE)) {
  389.                     goto finis;
  390.                 }
  391.                 if (b1 != strlen(w0)) {
  392.                     change_check();
  393.                 }
  394.             }
  395.             p1 = p1->ATO;
  396.             b1 = 0;
  397.         }
  398.         if (xf_set_tb_check(w)) {
  399.             goto finis;
  400.         }
  401.         mask = mark_find_mark(w);
  402.         jump(p1,b1);
  403.         if (mask) {    /* 再変換する中にマークがあった */
  404.             register UINT m = 1,bc = 0;
  405.             STR p;
  406.  
  407.             jump(p00,b00);    /* 範囲始めに飛ぶ */
  408.             for(;mask;m <<= 1,bc++) {
  409.                 if (mask & m) {
  410.                     mask ^= m;    /* ビットを倒す */
  411.                     mark_set_mark(bc);
  412.                 }
  413.             }
  414.             p = line_skip_mark(&CL_DATA[ANALYZE[CPX].BPOS]);
  415.             TBP00 = TBP0 = (int) (p - CL_DATA);
  416.         }
  417.         jump(p2,b2);
  418.         TL1 = p2;    /* 変換バッファの終了行 */
  419.         TPX1 = CPX;
  420.         TX1 = CX;
  421.         TY1 = CY;
  422.         TBP1 = ANALYZE[CPX].BPOS;
  423.  
  424.         xf_set_tb(w);
  425.     }
  426.     under_blanc();
  427.     return;
  428. finis:
  429.     etc_beep();
  430.     jump(p000,b000);
  431.     under_print("再変換にする対象が長すぎます");
  432.     return;
  433. }
  434.  
  435. /* クリックのON/OFF */
  436. /* トグルする */
  437. void
  438. ctrl_t_click()
  439. {
  440.     if (CLICK_MODE) {
  441.         CLICK_MODE = 0;
  442.     } else {
  443.         CLICK_MODE = 1;
  444.     }
  445. }
  446.  
  447. /* 情報付ファイルセーブ */
  448. void
  449. ctrl_t_ctrl_s()
  450. {
  451.     line_seigyou();
  452.     if (CURRENT_CHANGED) {
  453.         if (buff_save_file(1,NIL,NIL,NULL)) {
  454.             CURRENT_CHANGED = 0;
  455.             disp_btm_changed_erase_x(CURRENT_TEXT);
  456.         }
  457.     } else {
  458.         under_blanc();
  459.     }
  460. }
  461.  
  462. /* ファイル字詰め改行書き出し */
  463. void
  464. ctrl_t_ctrl_w()
  465. {
  466.     int flag,i = 0,i_rubi = 0,i_ul = 0;
  467.     UBYTE filename[MAXLINE];
  468.     UBYTE w[VERY_LONG_LINE*4],w0[VERY_LONG_LINE*4];
  469.     UNIT *wp;
  470.     FILE *fp;
  471.  
  472.     line_seigyou();
  473.     sprintf((char *) w,"ファイル字詰め改行書き出し [%s]: ",etc_ret_current_path());
  474.     if (under_input_cr_raw(w,filename) < 0) {    /* 無効であった = ^G */
  475.         under_print((STR)"[中断]");
  476.         return;
  477.     }
  478.  
  479.     under_print((STR)"[書き出し中...]");
  480.     if (!(fp = fopen((char *)filename,"w+b"))) {
  481.         under_print("ファイルをオープンできません。[中断]");
  482.         return;
  483.     }
  484.     wp = HEAD->ATO;
  485.     while(wp != TAIL) {
  486.         line_get_body(w0,wp);    /* 一行持ってくる */
  487.         if (cut_rubi_convert(w0,w,CURRENT_JIZUME)) {
  488.             if (ctrl_t_ctrl_w_sub(w,fp)) {
  489.                 goto ctrl_t_ctrl_w_err;
  490.             }
  491.             i_rubi++;
  492.         }
  493.  
  494.         /* ない訳がない */
  495.         string_to_main_string(w,w0);
  496.         if (ctrl_t_ctrl_w_sub(w,fp)) {
  497.             goto ctrl_t_ctrl_w_err;
  498.         }
  499.         i++;
  500.  
  501.         if (cut_ul_convert(w0,w,CURRENT_JIZUME)) {
  502.             if (ctrl_t_ctrl_w_sub(w,fp)) {
  503.                 goto ctrl_t_ctrl_w_err;
  504.             }
  505.             i_ul++;
  506.         }
  507.         wp = wp->ATO;
  508.     }
  509.     sprintf((char *) w,"[%d 行(その内、ルビ=(%d)行,下線=(%d)行)]",i+i_rubi+i_ul,i_rubi,i_ul);
  510.     under_print(w);
  511.  
  512.     if (fflush(fp)) {
  513.         goto ctrl_t_ctrl_w_err;
  514.     }
  515.     fclose(fp);
  516.     return;
  517.  
  518. ctrl_t_ctrl_w_err:
  519.     under_print((STR)"書き込みエラーが発生しました。[中断]");
  520.     fclose(fp);
  521. }
  522.  
  523. int
  524. ctrl_t_ctrl_w_sub(STR w,FILE *fp)
  525. {
  526.     if (etc_last(w) != CR) {
  527.         strcat(w,"\x0d\x0a");
  528.     } else {
  529.         int l;
  530.  
  531.         l = strlen(w);
  532.         w[l-1] = (UBYTE) '\x0d';
  533.         w[l] = (UBYTE) '\x0a';
  534.         w[l+1] = EOS;
  535.     }
  536.     return(fputs((char *)w,fp));
  537. }
  538.  
  539.  
  540. #if 0
  541. /* カットバッファをダンプする(デバッグ用) */
  542. void
  543. ctrl_t_cbd()
  544. {
  545.     int c,get_buff_c;
  546.     UBYTE w[VERY_LONG_LINE];
  547.  
  548.     window0();
  549.     get_buff_c = 0;
  550.     while(1) {
  551.         c = buff_get_from_cut_buff(w,0,get_buff_c);
  552.             /* カットバッファより1行取ってくる */
  553.         if (c < 0) {    /* もうない */
  554.             break;
  555.         }
  556.         get_buff_c = c + 1;
  557.         printf(":%s:\n",w);
  558.     }
  559.     binkey();
  560. }
  561. #endif
  562.  
  563. extern COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
  564. extern COMMAND_UNIT command_table0[MAX_COMMAND_NUMBER];
  565. extern COMMAND_UNIT command_table1[MAX_COMMAND_NUMBER];
  566.  
  567. /* トグルする */
  568. void
  569. ctrl_t_cmd()
  570. {
  571.     if (CMDMOD) {    /* me にする */
  572.         ctrl_t_me();
  573.     } else {    /* ed にする */
  574.         ctrl_t_ed();
  575.     }
  576. }
  577.  
  578. /* EM */
  579. STR function_table[2][32] = {    /* em */
  580. (STR)"\xfe先頭行\0",    /* F1 = esc< */
  581. (STR)"\xfe最終行\0",    /* F2 = esc> */
  582. (STR)"\xfe 置換 \0",    /* F3 = esc-R */
  583. (STR)"\xfe 検索 \0",    /* F4 = ^S */
  584. (STR)"\xfe次検索\0",    /* F5 = ^Sesc */
  585. (STR)"\xfe MARK \0",    /* F6 = esc. */
  586. (STR)"\xfe 削除 \0",    /* F7 = ^W */
  587. (STR)"\xfe 複写 \0",    /* F8 = escW */
  588. (STR)"\xfe 貼付 \0",    /* F9 = ^Y */
  589. (STR)"\xfe*EXIT*\0",    /* F10 = escZ */
  590. (STR)"",    /* F11 =  */
  591. (STR)"",    /* F12 =  */
  592. (STR)"",    /* F13 =  */
  593. (STR)"",    /* F14 =  */
  594. (STR)"",    /* F15 =  */
  595. (STR)"",    /* F16 =  */
  596. (STR)"",    /* F17 =  */
  597. (STR)"",    /* F18 =  */
  598. (STR)"",    /* F19 =  */
  599. (STR)"",    /* F20 =  */
  600. (STR)"\x16",    /* R-UP=^V (20)*/
  601. (STR)"\x1a",    /* R-DN=^Z (21)*/
  602. (STR)"",    /* INS */
  603. (STR)"\x04",    /* DEL */
  604. (STR)"\x10",    /* UP */
  605. (STR)"\x02",    /* LEFT (25)*/
  606. (STR)"\x06",    /* RIGHT (26)*/
  607. (STR)"\x0e",    /* DN (27)*/
  608. (STR)"\x1f",    /* CLR (28)*/
  609. (STR)"",    /* HELP */
  610. (STR)"",    /* HOME */
  611. (STR)"",    /* UNDO */
  612.  
  613. /* ED */
  614. (STR)"\xfe先頭行\0",    /* F1 = ed_ESC_B */
  615. (STR)"\xfe最終行\0",    /* F2 = ed_ESC_Z */
  616. (STR)"\xfe 置換 \0",    /* F3 = ed_ESC_R */
  617. (STR)"\xfe 検索 \0",    /* F4 = ed_ESC_N */
  618. (STR)"\xfe次検索\0",    /* F5 = ed_ESC_N_ESC */
  619. (STR)"\xfe 範囲 \0",    /* F6 = ed_ESC_. */
  620. (STR)"\xfe 削除 \0",    /* F7 = ed_ctrl_j_ctrl_w */
  621. (STR)"\xfe 複写 \0",    /* F8 = ed_ctrl_j_ESC_W */
  622. (STR)"\xfe 貼付 \0",    /* F9 = ed_ctrl_j_ctrl_y */
  623. (STR)"\xfe二重化\0",    /* F10 = ed_ctrl_j_2 */
  624. (STR)"",    /* F11 =  */
  625. (STR)"",    /* F12 =  */
  626. (STR)"",    /* F13 =  */
  627. (STR)"",    /* F14 = ed_ctrl_j_ctrl_r:逆方向検索 */
  628. (STR)"",    /* F15 = ed_ctrl_j_ctrl_r_ESC:逆方向次検索 */
  629. (STR)"",    /* F16 =  複数ファイル正順切り替え */
  630. (STR)"",    /* F17 =  複数ファイル逆順切り替え */
  631. (STR)"",    /* F18 =  */
  632. (STR)"",    /* F19 =  */
  633. (STR)"",    /* F20 =  */
  634. (STR)"\x03",    /* R-UP */
  635. (STR)"\x12",    /* R-DN */
  636. (STR)"",    /* INS */
  637. (STR)"\x07",    /* DEL */
  638. (STR)"\x05",    /* UP ^E */
  639. (STR)"\x13",    /* LEFT ^S */
  640. (STR)"\x04",    /* RIGHT ^D */
  641. (STR)"\x18",    /* DN ^X */
  642. (STR)"\x1f",    /* CLR */
  643. (STR)"",    /* HELP *//* キーバインド一覧 */
  644. (STR)"",    /* HOME *//* ^jH */
  645. (STR)""    /* UNDO *//* ^jE */
  646. };
  647.  
  648. void
  649. ctrl_t_ed0()
  650. {
  651.     register int i;
  652.  
  653.     CMDMOD = 1;
  654.     for(i=0;i<MAX_COMMAND_NUMBER;i++) {
  655.         command_table[i] = command_table1[i];
  656.     }
  657.     ctrl_t_cmd_cpy();/* func key set */
  658.  
  659.     if ((QUOTE = etc_command_pick('V'-'@',ed_ctrl_v)) & 0x80) {
  660.                 etc_command_patch_miss("コントロールコード入力",QUOTE &= 0x7f);
  661.         }
  662.         if ((XF_NEXT_BLOCK_KEY = etc_command_pick('X'-'@',ed_ctrl_x)) & 0x80) {
  663.                 etc_command_patch_miss("カーソルキーの「↓」",XF_NEXT_BLOCK_KEY &= 0x7f);
  664.         }
  665.     *function_table[1][27] = XF_NEXT_BLOCK_KEY;
  666.     if ((XF_BEFORE_BLOCK_KEY = etc_command_pick('E'-'@',ed_ctrl_e)) & 0x80) {
  667.                 etc_command_patch_miss("カーソルキーの「↑」",XF_BEFORE_BLOCK_KEY &= 0x7f);
  668.         }
  669.     *function_table[1][24] = XF_BEFORE_BLOCK_KEY;
  670.     if ((XF_RIGHT_KOHO_KEY = etc_command_pick('D'-'@',ed_ctrl_d)) & 0x80) {
  671.                 etc_command_patch_miss("カーソルキーの「→」",XF_RIGHT_KOHO_KEY &= 0x7f);
  672.         }
  673.     *function_table[1][26] = XF_RIGHT_KOHO_KEY;
  674.     if ((XF_LEFT_KOHO_KEY = etc_command_pick('S'-'@',ed_ctrl_s)) & 0x80) {
  675.                 etc_command_patch_miss("カーソルキーの「←」",XF_LEFT_KOHO_KEY &= 0x7f);
  676.         }
  677.     *function_table[1][25] = XF_LEFT_KOHO_KEY;
  678.     if ((XF_NEXT_PAGE_KEY = etc_command_pick('C'-'@',ed_ctrl_c)) & 0x80) {
  679.                 etc_command_patch_miss("「ROLL UP」キー",XF_NEXT_PAGE_KEY &= 0x7f);
  680.         }
  681.     *function_table[1][20] = XF_NEXT_PAGE_KEY;
  682.     if ((XF_BEFORE_PAGE_KEY = etc_command_pick('R'-'@',ed_ctrl_r)) & 0x80) {
  683.                 etc_command_patch_miss("「ROLL DOWN」キー",XF_BEFORE_PAGE_KEY &= 0x7f);
  684.         }
  685.     *function_table[1][21] = XF_BEFORE_PAGE_KEY;
  686.  
  687.     etc_kb_wash();
  688. }
  689.  
  690. void
  691. ctrl_t_ed()
  692. {
  693.     ctrl_t_ed0();
  694.     under_print((STR)"[ED.X モードにしました]");
  695. }
  696.  
  697. void
  698. ctrl_t_me0()
  699. {
  700.     register int i;
  701.  
  702.     CMDMOD = 0;
  703.     for(i=0;i<MAX_COMMAND_NUMBER;i++) {
  704.         command_table[i] = command_table0[i];
  705.     }
  706.     ctrl_t_cmd_cpy();/* func key set */
  707.  
  708.     if ((QUOTE = etc_command_pick('Q'-'@',ctrl_q)) & 0x80) {
  709.                 etc_command_patch_miss("コントロールコード入力",QUOTE &= 0x7f);
  710.         }
  711.     if ((XF_NEXT_BLOCK_KEY = etc_command_pick('N'-'@',ctrl_n)) & 0x80) {
  712.                 etc_command_patch_miss("カーソルキーの「↓」",XF_NEXT_BLOCK_KEY &= 0x7f);
  713.         }
  714.     *function_table[0][27] = XF_NEXT_BLOCK_KEY;
  715.     if ((XF_BEFORE_BLOCK_KEY = etc_command_pick('P'-'@',ctrl_p)) & 0x80) {
  716.                 etc_command_patch_miss("カーソルキーの「↑」",XF_BEFORE_BLOCK_KEY &= 0x7f);
  717.         }
  718.     *function_table[0][24] = XF_BEFORE_BLOCK_KEY;
  719.     if ((XF_RIGHT_KOHO_KEY = etc_command_pick('F'-'@',ctrl_f)) & 0x80) {
  720.                 etc_command_patch_miss("カーソルキーの「→」",XF_RIGHT_KOHO_KEY &= 0x7f);
  721.         }
  722.     *function_table[0][26] = XF_RIGHT_KOHO_KEY;
  723. /*window0();printf("[%x]",XF_RIGHT_KOHO_KEY);binkey();*/
  724.  
  725.     if ((XF_LEFT_KOHO_KEY = etc_command_pick('B'-'@',ctrl_b)) & 0x80) {
  726.                 etc_command_patch_miss("カーソルキーの「←」",XF_LEFT_KOHO_KEY &= 0x7f);
  727.         }
  728.     *function_table[0][25] = XF_LEFT_KOHO_KEY;
  729. /*window0();printf("[%x]",XF_LEFT_KOHO_KEY);binkey();*/
  730.  
  731.     if ((XF_NEXT_PAGE_KEY = etc_command_pick('V'-'@',ctrl_v)) & 0x80) {    /* ^V */
  732.                 etc_command_patch_miss("「ROLL UP」キー",XF_NEXT_PAGE_KEY &= 0x7f);
  733.         }
  734.     *function_table[0][20] = XF_NEXT_PAGE_KEY;
  735.     if ((XF_BEFORE_PAGE_KEY = etc_command_pick('Z'-'@',ctrl_z)) & 0x80) {    /* ^Z */
  736.                 etc_command_patch_miss("「ROLL DOWN」キー",XF_BEFORE_PAGE_KEY &= 0x7f);
  737.         }
  738.     *function_table[0][21] = XF_BEFORE_PAGE_KEY;
  739.     etc_kb_wash();
  740. }
  741.  
  742. void
  743. ctrl_t_me()
  744. {
  745.     ctrl_t_me0();
  746.     under_print((STR)"[ME モードにしました]");
  747. }
  748.  
  749.  
  750. ctrl_t_cmd_cpy()
  751. {
  752.     register int i;
  753.     register STR p;
  754.  
  755.     for(i=1;i<=32;i++) {
  756.         if (p = function_table[CMDMOD][i-1]) {
  757.             FNCKEYST(i,p);
  758. /*            FNCKEYST(i,"");*/
  759.         }
  760.     }
  761. }
  762.  
  763. #if 0
  764. void
  765. ctrl_t_f()
  766. {
  767.     int f,c;
  768.     STR p;
  769.     int main_or_sub,hinshi;
  770.     UBYTE yomi[MAXLINE],mojiretu[MAXLINE];
  771.     UBYTE w[MAXLINE];
  772.     UNIT *wp;
  773.  
  774.     etc_while_fep_qxf();
  775.     c = work_make_cut_buff0_list((STR)NULL,(STR)"",(STR)"");
  776.     /* -1 = 空、さもなくば、CUT_BUFF の総バイト長を返す */
  777.     if (c <= 0) {
  778.         under_print((STR)"カットバッファの中にセットする文字列を入れておいて下さい[中断]");
  779.         return;
  780.     }
  781.     if (c >= 32) {
  782.         under_print((STR)"セットしようとする文字列が長すぎます[中断]");
  783.         return;
  784.     }
  785.     wp = work_get_from_cut_buff0_list();    /* 一行持って来る */
  786.     line_get_body(mojiretu,wp);
  787.  
  788.     sprintf((char *) w,"[%s] をどのファンクションキーにセットしますか? [F11-F20]",mojiretu);
  789.     under_print0(w);
  790.     while(1) {
  791.         UINT code;
  792.  
  793.         if ((code = fep_qxf()) > 0x200) {
  794. window0();
  795. printf("[%x]",code);binkey();
  796.             FNCKEYST((code & 0x00f) + 10,mojiretu);            
  797.             break;
  798.         }
  799.         if (fep_INKEY() == '\x1b') {    /* ESC だ */
  800.             under_print((STR)"[中断]");
  801.             break;
  802.         }
  803.     }
  804.     etc_while_fep_qxf();    /* 離されるまで待つ */
  805. /*    under_blanc();*/
  806. }
  807. #endif
  808.  
  809. #if 0
  810. void
  811. ctrl_t_q()
  812. {
  813.     under_print(BAG);binkey();
  814. }
  815. #endif
  816.  
  817. /* 対応する括弧を挿入する */
  818. void
  819. ctrl_t_pair_left()
  820. {
  821.     ctrl_t_pair_r_l(-1);
  822. }
  823.  
  824. /* 対応する括弧を挿入する */
  825. void
  826. ctrl_t_pair_right()
  827. {
  828.     ctrl_t_pair_r_l(1);
  829. }
  830.  
  831. /* 対応する括弧を挿入する */
  832. void
  833. ctrl_t_pair_r_l(int delta)
  834. {
  835.     UNIT *wp;
  836.     int a,bp;
  837.     UBYTE w[VERY_LONG_LINE];
  838.     STR p;
  839.     UINT c;
  840.  
  841.     if ((a = etc_get_arg()) >= MAX_MARK) {
  842.         under_print((UBYTE *)"マーク番号が不適当です");
  843.         return;
  844.     }
  845.  
  846.     if (wp = mark_get_mark(a,&bp)) {    /* マークが存在した */
  847.         line_get_body(w,wp);
  848.         p = line_skip_xcode(&w[bp]);
  849.  
  850.         if (etc_char_byte_haba(p) == 2) {
  851.             c = (*p++) << 8;
  852.             c |= *p;
  853.             c += delta;
  854.             work_insert2(c);
  855.         } else {
  856.             c = *p;
  857.             c += delta;
  858.             if ((c == 0) || ( c == 0x80)
  859.              || (c == 0x9f) || (c == 0xe0)) {
  860.                 under_print("対応する文字列が不適当です");
  861.                 return;
  862.             }
  863.             work_insert1(c);
  864.         }
  865.         change_check();
  866.         under_blanc();
  867.         work_cursor_cpx();
  868.     } else {                /* マークが存在しない */
  869.         UBYTE w[MAXLINE];
  870.         sprintf((char *) w,"マーク %1d は設定されていません",a);
  871.         under_print(w);
  872.     }
  873. }
  874.  
  875. void
  876. ctrl_t_dm()
  877. {
  878. /*    xf_dic_flush();*/
  879.     xf_dic_learn_mode();
  880.     etc_while_fep_qxf();    /* 離されるまで待つ */
  881. }
  882.  
  883. /* マークとの間にアンダーラインを入れる */
  884. void
  885. ctrl_t_ctrl_l()
  886. {
  887.     UNIT *wp;
  888.     int bp;
  889.     int y;
  890.     int a;
  891.  
  892.     if ((a = etc_get_arg()) >= MAX_MARK) {
  893.         under_print((STR)"マーク番号が不適当です");
  894.         return;
  895.     }
  896.  
  897.     line_seigyou();
  898.     if (wp = mark_get_mark(a,&bp)) {
  899.         if (!LYW_UNDER && (!CWY0 && (CWY1 == UNDER_Y-2))) {
  900.             ctrl_t_l();
  901.         }
  902.         work_set_underline(wp,bp,CL,ANALYZE[CPX].BPOS);
  903.         line_cl_cl();
  904.         work_line_analyze();
  905.         under_print((STR)"[下線]");
  906.         work_cursor_cpx();
  907.     } else {
  908.         UBYTE w[MAXLINE];
  909.         sprintf((char *) w,"マーク %1d は設定されていません",a);
  910.         under_print(w);
  911.     }
  912. }
  913.  
  914. /* マークとの間のアンダーライン消去 */
  915. ctrl_t_ctrl_r()
  916. {
  917.     UNIT *wp;
  918.     int bp;
  919.     int a;
  920.  
  921.     if ((a = etc_get_arg()) >= MAX_MARK) {
  922.         under_print((STR)"マーク番号が不適当です");
  923.         return;
  924.     }
  925.  
  926.     line_seigyou();
  927.     if (wp = mark_get_mark(a,&bp)) {
  928.         work_erase_underline(wp,bp,CL,ANALYZE[CPX].BPOS);
  929.         line_cl_cl();
  930.         work_line_analyze();
  931.         under_print((STR)"[下線消去]");
  932.         work_cursor_cpx();
  933.     } else {
  934.         UBYTE w[MAXLINE];
  935.         sprintf((char *) w,"マーク %1d は設定されていません",a);
  936.         under_print(w);
  937.     }
  938. }
  939.  
  940. #if 0
  941. /* デバック用 */
  942. void
  943. ctrl_t_d()
  944. {
  945.     window0();
  946.     printf("[%x][%x][%x]\n",HEAD->MAE,HEAD,HEAD->ATO);
  947.     printf("[%x][%x][%x]\n",CL->MAE,CL,CL->ATO);
  948.     printf("[%x][%x][%x]\n",TAIL->MAE,TAIL,TAIL->ATO);
  949.     binkey();
  950. }
  951.  
  952. /* デバック用 */
  953. void
  954. ctrl_t_dd(int n)
  955. {
  956.     int i;
  957.  
  958.     window0();
  959.     for(i=0;i<MAX_WINDOW;i++) {
  960.         printf("(%d)[%d:%d][%d]\n",i,WDATA[i].WY0,WDATA[i].WY1,
  961.                         WDATA[i].WTEXTS);
  962.     }
  963. binkey();
  964. }
  965.  
  966.  
  967. void
  968. ctrl_t_d()
  969. {
  970.     int i;
  971.     UBYTE t[MAXLINE];
  972.     register UINT c;
  973.  
  974.     window0();
  975.     line_get_body(t,CL->MAE);
  976.     B_PRINT("\x1b[0K");
  977.     for(i=0;i<32;i++) {
  978.         if (iskanji(c = t[i])) {
  979.             c = (c<<8) | t[++i];
  980.         }
  981.         if (!t[i]) break;
  982.         printf("[%x]",c);
  983.     }
  984.     printf("\n");
  985.  
  986.     line_get_body(t,CL);
  987.     B_PRINT("\x1b[0K");
  988.     for(i=0;i<32;i++) {
  989.         if (iskanji(c = t[i])) {
  990.             c = (c<<8) | t[++i];
  991.         }
  992.         if (!t[i]) break;
  993.         printf("[%x]",c);
  994.     }
  995.     printf("\n");
  996.     line_get_body(t,CL->ATO);
  997.  
  998.     B_PRINT("\x1b[0K");
  999.     for(i=0;i<32;i++) {
  1000.         if (iskanji(c = t[i])) {
  1001.             c = (c<<8) | t[++i];
  1002.         }
  1003.         if (!t[i]) break;
  1004.         printf("[%x]",c);
  1005.     }
  1006.     printf("\n");
  1007.     binkey();
  1008. }
  1009.  
  1010. void
  1011. dump(int n,STR t)
  1012. {
  1013.     int i;
  1014.     register UINT c;
  1015.  
  1016.     window0();
  1017.     B_PRINT("\x1b[0K");
  1018.     for(i=0;i<32;i++) {
  1019.         if (iskanji(c = t[i])) {
  1020.             c = (c<<8) | t[++i];
  1021.         }
  1022.         if (!t[i]) break;
  1023.         printf("[%x]",c);
  1024.     }
  1025.     printf("{%d}\n",n);
  1026.     binkey();
  1027. }
  1028.  
  1029. #endif
  1030.  
  1031. /* 印刷 */
  1032. void
  1033. ctrl_t_p()
  1034. {
  1035.     PRN_TATE_MODE = 0;
  1036.     prnt_do();
  1037. }
  1038.  
  1039. /* 縦書き印刷 */
  1040. void
  1041. ctrl_t_pt()
  1042. {
  1043.     PRN_TATE_MODE = 1;
  1044.     prnt_do();
  1045. }
  1046.  
  1047. /* カットバッファを */
  1048. void
  1049. ctrl_t_s1()
  1050. {
  1051.     ctrl_t_get_cut("STRING-1 ← ",STRING_ESC1);
  1052. }
  1053.  
  1054. /* カットバッファを */
  1055. void
  1056. ctrl_t_s2()
  1057. {
  1058.     ctrl_t_get_cut("STRING-2 ← ",STRING_ESC2);
  1059. }
  1060.  
  1061. void
  1062. ctrl_t_get_cut(STR mess,STR d)
  1063. {
  1064.     UBYTE w[MAXLINE],w0[MAXLINE];
  1065.     UNIT *wp;
  1066.  
  1067.     work_make_cut_buff0_list((STR)NULL,"","");
  1068.     *w = EOS;
  1069.     while(1) {
  1070.         if (!(wp = work_get_from_cut_buff0_list())) {    /* 一行持って来る */
  1071.             break;
  1072.         }
  1073.         line_get_body(w0,wp);
  1074.         if (strlen(w0)) {
  1075.             if (strlen(w)+strlen(w0) < MAXLINE/2) {
  1076.                 strcat(w,w0);
  1077.             } else {
  1078.                 under_print("[カットバッファが長すぎます]");
  1079.                 return;
  1080.             }
  1081.         } else {
  1082.             break;
  1083.         }
  1084.     }
  1085.     string_to_main_string(d,w);    /* メイン文字だけにして転送 */
  1086.     strcpy(w,mess);
  1087.     strcat(w,"\"");
  1088.     etc_string_esc_cnv(d,w0);
  1089.     strcat(w,w0);
  1090.     strcat(w,"\"");
  1091.     under_print(w);
  1092. }
  1093.  
  1094. /* タグジャンプ */
  1095. void
  1096. ctrl_t_v()
  1097. {
  1098.     register UWORD c;
  1099.     register STR p0,p;
  1100.     int linenumber;
  1101.     UBYTE name[VERY_LONG_LINE];
  1102.     int cmd0;
  1103.  
  1104.     if (!(p0 = etc_first_filename_char(CL_DATA))) {
  1105.         goto tag_error;
  1106.     }
  1107.     if (isalpha(*p0)) {    /* 英字であるから */
  1108.         if (p0[1] == ':') {
  1109.             p = p0+2;
  1110.         } else {
  1111.             p = p0+1;
  1112.         }
  1113.     } else {
  1114.         p = p0 + etc_char_byte_haba(p0);
  1115.     }
  1116.     while(c = etc_jfirst(p)) {    /* 存在する */
  1117.         if (etc_is_filename_char(c)) {
  1118.             p += etc_char_byte_haba(p);
  1119.         } else {
  1120.             break;
  1121.         }
  1122.     }
  1123.  
  1124.     strncpy(name,p0,p-p0);
  1125.     name[p-p0] = EOS;
  1126.     if (!*name) {
  1127.         goto tag_error;
  1128.     }
  1129. /* 名前を得た */
  1130.     while(1) {
  1131.         if (c = etc_jfirst(p)) {    /* 存在する */
  1132.             if (isdigit(c)) {
  1133.                 break;
  1134.             } else {
  1135.                 p += etc_char_byte_haba(p);
  1136.             }
  1137.         } else {    /* EOS にぶつかった */
  1138.             goto tag_error;
  1139.         }
  1140.     }
  1141.     linenumber = atoi(p);
  1142. /* 実行する */
  1143.     mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  1144.     cmd0 = CMDMOD;
  1145.     CMDMOD = 0;
  1146.     ctrl_x_ctrl_f1_alway(name);
  1147.     CMDMOD = cmd0;
  1148.     meta_g0(linenumber);
  1149.     return;
  1150.  
  1151. tag_error:
  1152.     etc_beep();
  1153.     under_print("[タグファイルが無効です]");
  1154. }
  1155.  
  1156. /* ヘルプ */
  1157. void
  1158. ctrl_t_h()
  1159. {
  1160.     etc_func_off();
  1161.     help();
  1162.     etc_func_on();
  1163.     ctrl_l();
  1164. }
  1165.  
  1166. void
  1167. ctrl_t_PAGE()
  1168. {
  1169.     UBYTE w[MAXLINE];
  1170.  
  1171.     PAGE = etc_get_arg();
  1172.     sprintf(w,"ページを %d 行に設定しました",PAGE);
  1173.     under_print(w);
  1174. }
  1175.  
  1176. UBYTE devname0[MAXLINE] = {EOS};
  1177.  
  1178. /* デバイス書き出し */
  1179. void
  1180. ctrl_t_dev()
  1181. {
  1182.     int i = 0,l;
  1183.     UBYTE devname[MAXLINE];
  1184.     UBYTE w[VERY_LONG_LINE*4],w0[VERY_LONG_LINE*4],w00[VERY_LONG_LINE*4];
  1185.     UNIT *wp;
  1186.     FILE *fp;
  1187.  
  1188.     line_seigyou();
  1189.     sprintf((char *) w,"検索 [%s]<META>",STRING_ESC1_s);
  1190.  
  1191.     sprintf((char *) w,"デバイス書き出し [%s]: ",devname0);
  1192.     if (under_input_cr_raw(w,devname) < 0) {    /* 無効であった = ^G */
  1193.         if (devname[0] == 0x0d) {    /* いきなり改行 */
  1194.             strcpy(devname,devname0);
  1195.         } else {
  1196.             under_print((STR)"[中断]");
  1197.             return;
  1198.         }
  1199.     } else {
  1200.         strcpy(devname0,devname);
  1201.     }
  1202.  
  1203.     if (!*devname) {    /* デバイス名が指定されなかった */
  1204.         under_print((STR)"デバイス名が異常です:[中断]");
  1205.         return;
  1206.     }
  1207.     if (!(fp = fopen(devname,"wt")) < 0) {
  1208.         /* エラー */
  1209.         under_print((STR)"デバイスをオープンできません。[中断]");
  1210.         return;
  1211.     }
  1212.     under_print((STR)"[書き出し中...]");
  1213.     wp = HEAD->ATO;
  1214.     *w00 = EOS;
  1215.     while((wp != TAIL) || *w00) {
  1216.         *w = EOS;
  1217.         while(1) {
  1218.             if (*w00) {
  1219.                 strcpy(w,w00);
  1220.             }
  1221.             if (etc_last(w) == CR) {
  1222.                 break;
  1223.             }
  1224.             if (wp == TAIL) {
  1225.                 break;
  1226.             }
  1227.             line_get_body(w0,wp);    /* 一行持ってくる */
  1228.             wp = wp->ATO;
  1229.             i++;
  1230.             string_to_main_string(w00,w0);
  1231.             if ((strlen(w)+strlen(w00)) < VERY_LONG_LINE*4) {
  1232.                 strcat(w,w00);
  1233.                 *w00 = EOS;
  1234.             } else {
  1235.                 break;    /* 長すぎるので途中でフラッシュ */
  1236.             }
  1237.         }
  1238.         l = strlen(w);
  1239.         if (fwrite(w,1,l,fp) != l) {
  1240.             etc_beep();
  1241.             under_print((STR)"書き込みエラーが発生しました。[中断]");
  1242.             fclose(fp);
  1243.             return;
  1244.         }
  1245.     }
  1246.     fclose(fp);
  1247.     sprintf((char *) w,"[%d 行]",i);
  1248.     under_print(w);
  1249. }
  1250.  
  1251.